package com.school.device.util;

import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

public class SystemClock {
	private final int period;

	private final AtomicLong now;

	private static class InstanceHolder {
		private static final SystemClock INSTANCE = new SystemClock(1);
	}

	private SystemClock(int period) {
		this.period = period;
		this.now = new AtomicLong(System.currentTimeMillis());
		scheduleClockUpdating();
	}

	private static SystemClock instance() {
		return InstanceHolder.INSTANCE;
	}

	private void scheduleClockUpdating() {
		ScheduledExecutorService scheduler = new ScheduledThreadPoolExecutor(1, runnable -> {
			Thread thread = new Thread(runnable, "System Clock");
			thread.setDaemon(true);
			return thread;
		});
		scheduler.scheduleAtFixedRate(() -> now.set(System.currentTimeMillis()), period, period, TimeUnit.MILLISECONDS);
	}

	private long currentTimeMillis() {
		return now.get();
	}

	/**
	 * 用来替换原来的System.currentTimeMillis()
	 *
	 * @return unit时间戳
	 */
	public static long now() {
		return instance().currentTimeMillis();
	}
}
